#include "GeoDisplay.h"
#include <QFileDialog>
#include <QInputDialog>
#include <QMessageBox>

using namespace std;

//1.设置菜单栏
void GeoDisplay::setupMenuBar() {
	;
}
void GeoDisplay::setupMenuBar_slots() {
	//文件
	connect(ui.actionOpen, &QAction::triggered, this, &GeoDisplay::action_open);		//打开
	connect(ui.actionAdd, &QAction::triggered, this, [this]() {action_add(); });		//新增
	connect(ui.actionSave, &QAction::triggered, this, [this]() {m_curTap->action_save_image(); });		//保存
	connect(ui.actionOutput, &QAction::triggered, this, [this]() {action_output(0); });	//输出
	connect(ui.actionRun, &QAction::triggered, this, [this]() {action_run(); });		//执行算法

	//编辑

	//窗口（显示，隐藏各种窗口）
	connect(ui.actionOptionPanel, &QAction::toggled, m_optionsDock, &QDockWidget::setVisible);			//显示/隐藏选项面板
	connect(ui.actionTool_cmd, &QAction::toggled, ui.mainToolBar, &QToolBar::setVisible);				//显示/隐藏工具栏
	connect(ui.mainToolBar, &QToolBar::visibilityChanged, ui.actionTool_cmd, &QAction::setChecked);		//工具栏显示状态改变时，更新菜单栏（双向绑定）
}


void GeoDisplay::action_open(int read_file_type) {
	//1.读取文件,获取文件名称,更新配置信息
	if (read_file_type == 0) {			// 自动确定文件解析方式
		open_file_automatically();
	}
	else {
		open_specific_file(read_file_type);
	}
}
void GeoDisplay::open_file_automatically() {
	const QString fileFilter =
		"全部 (*.txt *.png *.jpg *.lines *.map);;"
		"文本文件 (*.txt);;"
		"图片 (*.png *.jpg)";
	QString qFullFileName = QFileDialog::getOpenFileName(this, "打开文件", m_config->m_qFilePath, fileFilter);
	if (qFullFileName.isEmpty()) {
		qDebug() << "用户取消了打开操作";
		return;
	}
	int read_file_type = 0;
	//2.根据给定的读取类型，读取文件
	QFileInfo fileInfo(qFullFileName);
	m_config->m_qFilePath = fileInfo.absolutePath();
	m_config->m_qFileName = fileInfo.fileName();
	//3.未指定文件类型，则根据文件名称,自动确定文件解析方案（方案0,1,2）
	QString qfileName_lower = m_config->m_qFileName.toLower();
	if (qfileName_lower.endsWith(".png") || qfileName_lower.endsWith(".jpg")) {
		read_file_type = 1;
	}
	else if (qfileName_lower.endsWith(".lines")) {
		read_file_type = 2;
	}
	else if (qfileName_lower.endsWith(".map")) {
        read_file_type = 3;
	}
	else if (qfileName_lower.endsWith(".txt")) {
		if (qfileName_lower.contains("lines")) {
			read_file_type = 2;
		}
		else if (qfileName_lower.contains("map")) {
			read_file_type = 3;
		}
	}
	//4.无法解析的类型
	if (read_file_type == 0) {
		//弹出提示窗口
		QMessageBox::warning(this, "错误!",
			"错误，文件解析失败，请检查文件名是否正确：\n\n"
			"1.解析后处理文件，以post开头，如post01.txt\n"
			"2.解析地图文件，以map开头，如map01.txt，或map01.png\n"
			"其他类型,请增加解析函数");
		return;
	}
	//4.可解析的类型,新建标签页,将读取的数据依赖到标签页中
	addDiagramTab(qFullFileName, read_file_type, this);
}
void GeoDisplay::open_specific_file(int readType) {
	QString qFullFileName = QFileDialog::getOpenFileName(this, "打开文件", m_config->m_qFilePath, "json文件 (*.json)");
	if (qFullFileName.isEmpty()) {
		qDebug() << "用户取消了打开操作";
		return;
	}
	addDiagramTab(qFullFileName, readType, this);		//readType=11及以上，为自定义解析方案
}
void GeoDisplay::action_add() {
	if (m_tabWidget->count() == 0) {
		action_open();
	}
	else {
		//1.读取文件,获取文件名称,更新配置信息
		QString qFullFileName = QFileDialog::getOpenFileName(this, "打开文件", m_config->m_qFilePath, "*");
		if (qFullFileName.isEmpty()) { std::cout << "Failed to read data!" << std::endl; return; }
		QFileInfo fileInfo(qFullFileName);
		m_config->m_qFilePath = fileInfo.absolutePath();
		m_config->m_qFileName = fileInfo.fileName();
		//2.根据文件名称,确定文件解析方案
		int read_file_type = -1;
		QString qfileName_lower = m_config->m_qFileName.toLower();
		if (qfileName_lower.endsWith(".png") || qfileName_lower.endsWith(".jpg")) {
			read_file_type = 0;		//解析图片形式的地图文件
		}
		else if (qfileName_lower.endsWith(".txt")) {
			if (qfileName_lower.startsWith("post")) {
				read_file_type = 1;	//解析后处理文件
			}
			else if (qfileName_lower.startsWith("map")) {
				read_file_type = 2;	//解析文本形式的地图文件
			}
		}
		//3.无法解析的类型
		if (read_file_type == 1 && m_curTap->m_data_type == 1) {	//两者都为后处理文件
			actionAddData(qFullFileName, read_file_type);
		}
		else {
			QMessageBox::warning(this, "错误!", "添加的数据类型不匹配");
			return;
		}
	}
}
void GeoDisplay::action_output(int type) {
	//type取值：0，输出后处理之后的数据
	switch (type) {
	case 0:
		m_curTap->action_write_after_post();
		break;
	case 1:
		break;
	default:
		break;
	}
}
void GeoDisplay::action_run() {
	m_curTap->setPPDTRun();
}
